#include<bits/stdc++.h>

using namespace std;
using ll = long long;
#define endl '\n'
const int maxn = 4;
int n = 4, m = 4;
char G[maxn][maxn] = {  //平面图 矩形 默认行为n 列为m
        'A', 'B', '/', 'D',
        'E', 'F', '/', '/',
        'I', 'J', 'K', 'L',
        'M', '/', '/', 'P'
};
int book[maxn][maxn];
int fx[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};//四连通 顺时针方向
struct Node {
    int x, y;
};
/**
 * 判断起点s(sx,sy) 与 终点e(ex,ey)连通算法
 * @param sx  源点的横坐标
 * @param sy  源点的纵坐标
 * @param ex 终点的横坐标
 * @param ey 终点的纵坐标
 * @return  s,e是否连通，如果连通返回1 否则返回0
 */
bool bfs(int sx, int sy, int ex, int ey) {
    queue<Node> Q;      //初始化一个点的空队列
    Q.push({sx, sy});     //把起点{x,y}压入队列
    book[sx][sy] = 1;     //入队即标记防止重复访问
    while (!Q.empty()) {
        Node head = Q.front();//获得队头结点
        int hx = head.x;
        int hy = head.y;
        if (hx == ex && hy == ey) {
            return true;
        }
        for (int i = 0; i < 4; i++) {
            int nx = hx + fx[i][0];//相邻的四连通点的x新坐标
            int ny = hy + fx[i][1];//相邻的四连通点的y新坐标
            if (nx < 0 || nx >= n || ny < 0 || ny >= m)continue; //检查位置的有效性
            if (G[nx][ny] == '/' || book[nx][ny] == 1)continue;//避免重复访问
            Q.push({nx, ny});//扩张的点再次入队
            book[nx][ny] = 1;//入队即标记防止重复访问
        }
        Q.pop();//出队，删除头结点
    }
    return false;
}


int main() {
    cout << bfs(0, 0, 0, m - 1) << endl;//A->D;
    //  memset(book, 0, sizeof(book));//C-style;
    fill(book[0], book[0] + maxn * maxn, 0);//c++ style
    cout << bfs(0, 0, n - 1, m - 1) << endl;//A->P?
    return 0;
}
